Lektion 16



Dieses Tutorial kommt von Chris Aliotta...

Sie wollen also Nebel in Ihr OpenGL-Programm einfügen? Nun denn, in diesem Tutorial zeige ich genau wie man das macht. Das ist das erste Mal, dass ich ein Tutorial schreibe und ich bin auch noch realtiv neu, was OpenGL/C++ Programmierung angeht, deshalb die Bitte, wenn Sie etwas finden, was falsch ist, lassen Sie es mich wissen und haben Sie etwas Nachsicht. Dieser Code basiert auf dem Code aus Lektion 7.

Daten initialisieren:
Wir fangen mit der Initialisierung unserer Variablen an, die die Informationen für Nebel enthalten. Die Variable fogMode wird benutzt, um drei Arten von Nebel aufzunehmen: GL_EXP, GL_EXP2 und GL_LINEAR. Ich werde die Unterschiede zwischen den dreien später erklären. Die Variablen stehen am Anfang des Codes hinter der Zeile GLuint texture[3]. Die Variable fogfilter wird benutzt um auf dem laufenden zu bleiben, welche Art Nebel gerade verwendet wird. Die Variable fogColor enthält die Farbe die unser Nebel haben soll. Ich habe außerdem die boolesche Variable gp am Anfang des Codes eingefügt, so dass wir überprüfen können, ob die 'g'-Taste später in diesem Tutorial gedrückt wurde.

bool   gp;						// G gedrückt? ( Neu )
GLuint filter;						// Welcher Filter benutzt wird
GLuint fogMode[]= { GL_EXP, GL_EXP2, GL_LINEAR };	// Speicher für drei Arten von Nebel
GLuint fogfilter= 0;					// Welche Nebel benutzt wird
GLfloat fogColor[4]= {0.5f, 0.5f, 0.5f, 1.0f};		// Nebel Farbe

DrawGLScene Setup

Nachdem wir unsere Variablen eingeführt haben gehen wir weiter zu InitGL. Die glClearColor() Zeile wurde geändert, um den Bildschirm mit der selbe Farbe wie dem Nebel zu löschen, um einen besseren Effekt zu erzielen. Es wird nicht viel Code benötigt, um Nebe zu erzeugen. Sie werden es sehr leicht finden.

glClearColor(0.5f,0.5f,0.5f,1.0f);			// Wir löschen auf die Farbe des Nebels ( Geändert)

glFogi(GL_FOG_MODE, fogMode[fogfilter]);		// Nebel Modus
glFogfv(GL_FOG_COLOR, fogColor);			// Setze Nebel Farbe
glFogf(GL_FOG_DENSITY, 0.35f);				// Wie dicht wird der Nebel
glHint(GL_FOG_HINT, GL_DONT_CARE);			// Nebel Hinweis Wert
glFogf(GL_FOG_START, 1.0f);				// Nebel Anfangs-Tiefe
glFogf(GL_FOG_END, 5.0f);				// Nebel End-Tiefe
glEnable(GL_FOG);					// Aktiviert GL_FOG

Schauen wir uns die ersten drei Zeilen an. Die erste Zeile glEnable(GL_FOG); ist ziemlich selbsterklärend. Grundsätzlich initialisiert sie den Nebel.

Die zweite Zeile, glFogi(GL_FOG_MODE, fogMode[fogfilter]); stellt den Filter-Modus ein. Vorher haben wir das Array fogMode deklariert. Es enthält GL_EXP, GL_EXP2 und GL_LINEAR. Hier kommen diese Variablen ins Spiel. Lassen Sie mich jede einzelne erklären: Die dritte Zeile, glFogfv(GL_FOG_COLOR, fogcolor); setzt die Farbe des Nebels. Vorher hatten wir diese auf (0.5f,0.5f,0.5f,1.0f) gesetzt, indem wir die Variable fogcolor benutzen, um ein netten Grauton zu erhalten.

Schauen wir uns die letzten vier Zeilen an. Die Zeile glFogf(GL_FOG_DENSITY, 0.35f); gibt an, wie Dicht der Nebel sein soll. Erhöhen Sie diesen Wert, um den Nebel dicker zu machen oder senken Sie den Wert um den Nebel zu lichten.

Die Zeile glHint (GL_FOG_HINT, GL_DONT_CARE); signalisiert einen Hinweis. Ich habe GL_DONT_CARE benutzt, weil ich keinen Wert auf den Hinweis-Wert lege.

Eric Desrosiers fügt hinzu: Kleine Erklärung von glHint(GL_FOG_HINT, hintval);

hintval kann sein : GL_DONT_CARE, GL_NICEST oder GL_FASTEST

gl_dont_care - Lässt OpenGL die Art des Nebels auswählen (per vertex oder per pixel) und eine unbekannte Formel.
gl_nicest - Erzeugt den Nebel per Pixel (sieht gut aus)
glfastest - Erzeugt den Nebel per Vertex (schneller, aber weniger schön)

Die nächste zeile, glFogf(GL_FOG_START, 1.0f); bestimmt, wie dicht am Bildschirm der Nebel beginnen soll. Sie können diesen Wert auf was immer Sie wollen ändern, abhängig davon, wo Sie den Nebel starten lassen wollen. Die nächste Zeile ist ähnlich, glFogf(GL_FOG_END, 5.0f);. Diese teilt dem OpenGL-Programm mit, wie weit hinein der Nebel gehen soll.

Ereignisse beim Tastendruck

Nun, da wir den Code zum Zeichnen des Nebels fertig haben, fügen wir noch die Tastatur-Befehle ein, um zwischen den verschiedenen Nebel-Modi umzuschalten. Dieser Code kommt ans Ende des Programms, zu dem anderen Code, wo auch die anderen Tasten abgefragt werden.

if (keys['G'] && !gp)					// Wurde die Taste G gedrückt?
{
	gp=TRUE;					// gp wird auf TRUE gesetzt
	fogfilter+=1;					// Erhöhe fogfilter um 1
	if (fogfilter>2)				// Ist fogfilter größer als 2?
	{
		fogfilter=0;				// Wenn ja, setze fogfilter auf 0
	}
	glFogi (GL_FOG_MODE, fogMode[fogfilter]);	// Nebel-Modus (Fog Mode)
}
if (!keys['G'])						// Wurde die Taste G wieder losgelassen?
{
	gp=FALSE;					// Wenn ja, setze gp auf FALSE
}



Das war's! Wir sind fertig! Nun haben Sie Nebel in Ihrem OpenGL Programm. Ich muss sagen, dass das ziemlich schmerzlos war. Wenn Sie Fragen oder Kommentare haben, können Sie mich gerne unter chris@incinerated.com. kontaktieren. Bitte besucht auch meine Webseite: http://www.incinerated.com/ und http://www.incinerated.com/precursor.